Тривиль, не-тривиль, ну и совсем не тривиль

Перенес из комментария, там уже слишком много.

Денис Будяк пишет:

«Алексей, тему полиморфизма можно дальше обсуждать. Например, аналог interface{} в Активном Обероне уже есть, хотя работает только для записей, но есть желание и планы расширить его возможности. Просто интерфейсы в го вызывают у меня сомнения (их утиность), но и такое можно сделать. Но по опыту могу судить, что если человек что-то решил в своём хобби-проекте, то его уже не свернуть с выбранного пути. Это так в нашем случае? Просто чтобы я зря не тратил время.»

Давайте разделим. Что касается Тривиля, то это временный инструмент, нужный мне для того, чтобы получить инструмент разработки. Он нужен для того, чтобы:

  1. написать на нем компилятор самого Тривиля
  2. а потом на нем написать компилятор следующего языка, условно, Нетривиль (Невиль? или Давиль?).

Обсуждать возможности Тривиля нет смысла, это минимальный язык (в смысле минимизации конструкций языка и в смысле минимизации трудозатрат на компилятор).

А вот все, что касается Невиля — обсуждать есть смысл, и интерфейсы, и утиную типизацию, и вариантные типы, и null safety и обобщенные типы… И что еще там бывает…

Вот, кстати, интересная статья про полиморфизм: Models of Generics and Metaprogramming: Go, Rust, Swift, D and More

 

3 комментария


  1. Имхо, Денис тут не прав. Интерфейс — это про поведение, а не про состояние. И в Го, это как раз сделано грамотно. По крайней мере, весь мой опыт говорит о том, что утиная типизация по поведению — это отличная идея. Если объект может прикинуться уткой — ну пусть будет уткой. не по форме, а именно по поведению!
    По предыдущей заметке я поддерживаю Ваше стремление к минимализму, лишний сахарок тащить в язык без ясного понимания зачем он нужен — плохая идея с самого начала. Единственное возражение (именно по прошлой части) или точнее небольшое сомнение вызывает Ваше желание использовать именно Си для компиляции. Я профан в Си, но как он переваривает UTF-8 в части русских литер и строк? Как он вообще с ними работает? Не сомневаюсь, что библиотечно это вопрос решён, но всё же. Как минимум в самом начале компилятор Go — был написан на Си (сейчас на Go).

    Ответить

    1. Утиная типизация важна для динамической сборки программы из независимо разработанных компонент. В Невиле (надо же как-то этот язык называть) утиная типизация должна быть.

      Си и UTF-8: Так как строка в UTF-8 кодировке — это массив байтов, то единственная мелкая сложность в Си — это напечатать строку. Все остальное без проблем.

      Использование Си — это из-за требования минимализма. Я не рассматриваю Си как язык программирования, это переносимый ассемблер. Другого такого простого инструмента я не знаю, генерация LLVM IR заметно сложнее. В какой-то момент (не скоро) переход на LLVM станет неизбежным, чтобы поддержать компонентную модель, хотя сначала я посмотрю на Rust MIR. Его я знаю поверхностно, и не уверен, что подойдет.

      Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *